/*
 * @Author: i@douxuefeng.cn
 * @Date: 2022-05-14 17:03:17
 * @LastEditTime: 2022-07-26 09:44:17
 * @LastEditors: i@douxuefeng.cn
 * @Description:
 * @FilePath: \go-utils\wechat\pay\mini.go
 */

package pay

import (
	"github.com/wechatpay-apiv3/wechatpay-go/core"
	"github.com/wechatpay-apiv3/wechatpay-go/services/payments"
	"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
)

type miniApi struct {
	*PayConfig
}

func NewMiniApi(cfg *PayConfig) *miniApi {
	return &miniApi{cfg}
}

/**
 * @name: 预下单
 * @description:
 * @param {Prepay} prepay
 * @return {*}
 */
func (p *miniApi) PrepayOrder(prepay OrderRequest) (*jsapi.PrepayWithRequestPaymentResponse, *core.APIResult, error) {
	client, ctx, err := GetClient(p.PayConfig)
	if err != nil {
		return nil, nil, err
	}
	svc := jsapi.JsapiApiService{Client: client}
	resp, result, err := svc.PrepayWithRequestPayment(ctx,
		jsapi.PrepayRequest{
			Appid:       core.String(p.MiniAppid),
			Mchid:       core.String(p.MchId),
			Description: core.String(prepay.Description),
			OutTradeNo:  core.String(prepay.OutTradeNo),
			Attach:      core.String(prepay.Attach),
			NotifyUrl:   core.String(p.Notify),
			Amount: &jsapi.Amount{
				Total: core.Int64(int64(prepay.Amount * 100)),
			},
			Payer: &jsapi.Payer{
				Openid: core.String(prepay.Openid),
			},
			SceneInfo: &jsapi.SceneInfo{
				PayerClientIp: core.String(prepay.ClientIp),
			},
		},
	)
	return resp, result, err
}

func (p *miniApi) QueryOrderByTransactionId(transactionId string) (*payments.Transaction, *core.APIResult, error) {
	client, ctx, err := GetClient(p.PayConfig)
	if err != nil {
		return nil, nil, err
	}
	svc := jsapi.JsapiApiService{Client: client}
	return svc.QueryOrderById(ctx, jsapi.QueryOrderByIdRequest{
		Mchid:         core.String(p.MchId),
		TransactionId: core.String(transactionId),
	})
}

func (p *miniApi) QueryOrderByOutTradeNo(outNo string) (*payments.Transaction, *core.APIResult, error) {
	client, ctx, err := GetClient(p.PayConfig)
	if err != nil {
		return nil, nil, err
	}
	svc := jsapi.JsapiApiService{Client: client}
	return svc.QueryOrderByOutTradeNo(ctx, jsapi.QueryOrderByOutTradeNoRequest{
		Mchid:      core.String(p.MchId),
		OutTradeNo: core.String(outNo),
	})
}
